package com.gitee.ywj1352.common.message;

import com.gitee.ywj1352.common.util.JSONUtils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;

import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import java.util.Map;

@Data
public class Message {
    private MessageHeader messageHeader;
    private LinkedHashMap<String, String> messageBody;

    public Map<String, String> getMessageBody() {
        return messageBody;
    }

    public void encode(ByteBuf byteBuf) {
        byteBuf.writeInt(messageHeader.getVersion());
        byteBuf.writeLong(messageHeader.getStreamId());
        byteBuf.writeBytes(JSONUtils.serialize(messageBody).getBytes(StandardCharsets.UTF_8));
    }

    public void decode(ByteBuf byteBuf) {
        int version = byteBuf.readInt();
        long streamId = byteBuf.readLong();
        MessageHeader messageHeader = new MessageHeader();
        messageHeader.setVersion(version);
        messageHeader.setStreamId(streamId);
        this.setMessageHeader(messageHeader);
        String s = byteBuf.toString(StandardCharsets.UTF_8);
        messageBody = JSONUtils.deserialize(s, LinkedHashMap.class);
    }


    public void generate(Class<?>[] parameterTypes, Object[] params) {
        messageBody = new LinkedHashMap<>(params.length);
        for (int i = 0; i < parameterTypes.length; i++) {
            messageBody.put(parameterTypes[i].getName(), JSONUtils.serialize(params[i]));
        }
    }
//
//    public static void main(String[] args) {
//        Message message = new Message();
//        MessageHeader messageHeader = new MessageHeader();
//        messageHeader.setStreamId(1L);
//        messageHeader.setVersion(0);
//        message.setMessageHeader(messageHeader);
//        message.generate(new Class[]{String.class},new Object[]{"ywj"});
//        ByteBuf buffer = Unpooled.buffer();
//        message.encode(buffer);
//        System.out.println(buffer);
//        Message message1 = new Message();
//        message1.decode(buffer);
//        System.out.println(message1);
//    }

}
